package cn.tedu.design;/**
 * @Author 金帮嘉诚 @Date 2021-06-24 星期四 19:32
 */
/*本类用于测试单例模式在设计方案二：懒汉式*/

/**
 * 知识点
 * 用的时候才创建
 */
public class Singleton2 {
    public static void main(String[] args) {
        MySingle2 s1 = MySingle2.getMySingle2();
        MySingle2 s2 = MySingle2.getMySingle2();
        System.out.println(s1 == s2);
        System.out.println(s1);
        System.out.println(s2);
    }
}

/*问题：
 * 共享资源single2，并且多条语句操作了共享资源
 * 所以single2在多线程下会有数据安全隐患
 * 解决方案：同步代码块
 * 【加锁：范围是操作资源的所有代码】
 * 解决方案二：同步方法
 * 【如果一个方法中所有代码均需要同步，可以使用同步方法】*/
class MySingle2 {
    private MySingle2() {
    }

    //注意，此处不创建对象，不赋值
    //声明与赋值分离
    private static MySingle2 single2;

    static Object object = new Object();

    //或者用同步方法
    public static MySingle2 getMySingle2() {

        synchronized (object) {
            if (single2 == null) {
                single2 = new MySingle2();
            }
        }

        return single2;
    }
}
